from datetime import datetime

from flask import Blueprint, jsonify, request, current_app
from flask_jwt_extended import jwt_required

from applications.extensions import db
from applications.models import Product, ProductCate, ProductTag

goods_bp = Blueprint('goods_bp', __name__, url_prefix='/system/goods')


# 获取商品列表
@goods_bp.route('/list', methods=['GET'])
@jwt_required()
def get_goods_list():
    """
    获取商品列表
    :return: 商品列表数据
    """
    try:
        # 获取查询参数
        page = int(request.args.get('page', 1))
        per_page = int(request.args.get('pageSize', 10))
        name = request.args.get('name', '')
        category_id = request.args.get('category_id', None)
        status = request.args.get('status', None)

        # 构建查询
        query = Product.query

        # 应用过滤条件
        if name:
            query = query.filter(Product.name.like(f'%{name}%'))
        if category_id:
            query = query.filter(Product.category_id == category_id)
        if status is not None and status != '':
            try:
                status = int(status)
                query = query.filter(Product.status == status)
            except ValueError:
                return jsonify({'code': 400, 'message': '无效的状态参数'}), 400

        # 执行分页查询
        pagination = query.order_by(Product.create_time.desc()).paginate(page=page, per_page=per_page)

        # 构建响应数据
        products = [{
            'id': product.id,
            'name': product.name,
            'price': product.price,
            'stock': product.stock,
            'sales': product.sales,
            'images': product.images,
            'brand': product.brand,
            'description': product.description,
            'detail_html': product.detail_html,
            'main_image': product.main_image,
            'category_id': product.category_id,
            'category_name': product.category.name if product.category else None,
            'status': product.status,
            'tag_ids': [tag.id for tag in product.tags],
            'create_time': product.create_time.strftime('%Y-%m-%d %H:%M:%S') if product.create_time else None,
            'update_time': product.update_time.strftime('%Y-%m-%d %H:%M:%S') if product.update_time else None
        } for product in pagination.items]

        return jsonify({
            'code': 200,
            'message': '获取商品列表成功',
            'data': {
                'list': products,
                'pages': pagination.pages,
                'page': page,
                'per_page': per_page
            },
            'total': pagination.total,
        })
    except Exception as e:
        current_app.logger.error(f'获取商品列表失败: {str(e)}')
        return jsonify({'code': 500, 'message': f'获取商品列表失败: {str(e)}'})


# 获取商品详情
@goods_bp.route('/detail', methods=['POST'])
@jwt_required()
def get_goods_detail():
    """
    获取商品详情
    :return: 商品详情数据
    """
    try:
        product_id = request.json.get('id')
        product = Product.query.get_or_404(product_id)

        # 安全处理 images 字段
        images = (
            product.images.split(',')
            if isinstance(product.images, str)
            else product.images or []
        )
        # 构建商品详情数据
        product_data = {
            'id': product.id,
            'name': product.name,
            'description': product.description,
            'price': product.price,
            'stock': product.stock,
            'sales': product.sales,
            'main_image': product.main_image,
            'images': images,
            'detail_html': product.detail_html,
            'category_id': product.category_id,
            'category_name': product.category.name if product.category else None,
            'tag_ids': [tag.id for tag in product.tags],
            'status': product.status,
            'brand': product.brand,
            'create_time': product.create_time.strftime('%Y-%m-%d %H:%M:%S') if product.create_time else None,
            'update_time': product.update_time.strftime('%Y-%m-%d %H:%M:%S') if product.update_time else None
        }

        return jsonify({'code': 200, 'message': '获取商品详情成功', 'data': product_data})
    except Exception as e:
        current_app.logger.error(f'获取商品详情失败: {str(e)}')
        return jsonify({'code': 500, 'message': f'获取商品详情失败: {str(e)}'}), 500


# 新增商品
@goods_bp.route('/add', methods=['POST'])
@jwt_required()
def add_goods():
    """
    新增商品
    :return: 新增商品成功或失败的响应
    """
    try:
        data = request.get_json()
        if not data:
            return jsonify({'code': 400, 'message': '请求数据不能为空'}), 400

        required_fields = ['name', 'price', 'stock', 'category_id', 'status']
        for field in required_fields:
            if field not in data:
                return jsonify({'code': 400, 'message': f'缺少必填字段: {field}'}), 400

        new_product = Product(
            name=data['name'],
            price=data['price'],
            salePrice=data.get('salePrice'),
            stock=data['stock'],
            sort=data.get('sort', 0),
            sales=data.get('sales', 0),
            main_image=data.get('main_image'),
            images=data.get('images', []),
            description=data.get('description', ''),
            detail_html=data.get('detail_html'),
            category_id=data['category_id'],
            status=data['status'],
            brand=data.get('brand'),
            create_time=datetime.now()
        )

        db.session.add(new_product)
        # 处理商品标签（如果提供了tag_ids）
        if 'tag_ids' in data:
            if not isinstance(data['tag_ids'], list):
                return jsonify({'code': 400, 'message': 'tag_ids必须是数组'}), 400

            # 查询所有存在的标签ID
            existing_tags = ProductTag.query.filter(
                ProductTag.id.in_(data['tag_ids']),
                ProductTag.status == 1  # 只允许关联启用的标签
            ).all()

            # 验证标签是否存在
            if len(existing_tags) != len(set(data['tag_ids'])):
                return jsonify({'code': 400, 'message': '部分标签不存在或未启用'}), 400

            # 添加标签关联
            new_product.tags.extend(existing_tags)

        db.session.commit()

        return jsonify({
            'code': 201,
            'message': '新增商品成功',
            'data': {
                'id': new_product.id,
                'tag_ids': [tag.id for tag in new_product.tags]
            }
        }), 201

    except Exception as e:
        db.session.rollback()
        current_app.logger.error(f'新增商品失败: {str(e)}')
        return jsonify({'code': 500, 'message': f'新增商品失败: {str(e)}'}), 500


# 修改商品
@goods_bp.route('/update', methods=['POST'])
@jwt_required()
def update_goods():
    """
    修改商品
    :return: 修改商品成功或失败的响应
    """
    try:
        data = request.get_json()
        if not data:
            return jsonify({'code': 400, 'message': '请求数据不能为空'}), 400
        
        product_id = data.get('id')
        product = Product.query.get_or_404(product_id)

        updatable_fields = [
            'name', 'price', 'stock', 'sales', 'main_image',
            'images', 'detail_html', 'category_id', 'status',
            'brand', 'description'
        ]

        for field in updatable_fields:
            if field in data:
                setattr(product, field, data[field])

        # 处理商品标签（如果提供了tag_ids）
        if 'tag_ids' in data:
            if not isinstance(data['tag_ids'], list):
                return jsonify({'code': 400, 'message': 'tag_ids必须是数组'}), 400

            # 查询所有存在的标签ID
            existing_tags = ProductTag.query.filter(
                ProductTag.id.in_(data['tag_ids']),
            ).all()

            # 验证标签是否存在
            if len(existing_tags) != len(set(data['tag_ids'])):
                return jsonify({'code': 400, 'message': '部分标签不存在'}), 400

            # 直接替换原有标签关系
            product.tags = existing_tags

        db.session.commit()

        return jsonify({
            'code': 200,
            'message': '商品信息修改成功',
            'data': {
                'tag_ids': [tag.id for tag in product.tags]  # 返回更新后的标签ID
            }}), 200

    except Exception as e:
        db.session.rollback()
        current_app.logger.error(f'修改商品信息失败: {str(e)}')
        return jsonify({'code': 500, 'message': f'修改商品信息失败: {str(e)}'}), 500


# 更新商品状态
@goods_bp.route('/update-status', methods=['POST'])
@jwt_required()
def update_goods_status():
    """
    更新商品状态
    :return: 更新结果
    """
    try:
        data = request.json
        product_id = data.get('id')
        product = Product.query.get_or_404(product_id)

        # 更新状态
        status = data.get('status')
        if status is not None and status in [0, 1]:
            product.status = status
            db.session.commit()
            return jsonify({'code': 200, 'message': '更新商品状态成功'})
        else:
            return jsonify({'code': 400, 'message': '无效的状态值'}), 400
    except Exception as e:
        db.session.rollback()
        current_app.logger.error(f'更新商品状态失败: {str(e)}')
        return jsonify({'code': 500, 'message': f'更新商品状态失败: {str(e)}'}), 500


# 删除商品
@goods_bp.route('/del', methods=['POST'])
@jwt_required()
def del_goods():
    """
    删除商品
    :return: 删除商品成功或失败的响应
    """
    try:
        product_id = request.json.get('id')
        product = Product.query.get_or_404(product_id)

        db.session.delete(product)
        db.session.commit()

        return jsonify({'code': 200, 'message': '商品删除成功'}), 200

    except Exception as e:
        db.session.rollback()
        current_app.logger.error(f'删除商品失败: {str(e)}')
        return jsonify({'code': 500, 'message': f'删除商品失败: {str(e)}'}), 500


def register_goods_bps(app):
    app.register_blueprint(goods_bp)